﻿
/**
* 命名空间: Game.TDBehaviorTree
*
* 功 能：装饰节点
*        
* 类 名： NodeDecorate
*         修饰节点只有一个子节点，执行子节点直到 执行结果 = untilResultType,将 结果返回给父节点
         如果执行结果 !=ResultType 则返回 Running
         装饰节点类型:
         1、Until Success和Until Failure
            循环执行子节点，直到返回“成功”或“失败”为止。
           比如Until Success在子节点返回“运行中”和“失败”时都会向父节点返回“运行中”，返回“成功”时向父节点返回“成功”。
           Until Failure在子节点返回“运行中”和“成功”时都会向父节点返回“运行中”，返回“失败”时向父节点返回“成功”。
         2、Limit
            执行子节点一定次数后强制返回“失败”。
            当子节点运行指定次数后还没有返回“失败”则该节点向父节点返回失败。
         3、Timer
            子节点不会立即执行，而会在指定的时间到达后才开始执行。
         4、TimeLimit
            指定子节点的最长运行时间，如果子节点在指定时间到达后还在运行则强制返回“失败”。
         5、Invert
            对子节点的返回结果取“非”，即子节点返回“成功”则该节点返回“失败”，子节点返回“失败”则该节点返回成功。


* Ver 变更日期 负责人 变更内容
* ───────────────────────────────────
* V0.01 2019/12/11 18:02:53  
*/




using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Game.TDBehaviorTree
{
   
    [System.Serializable]
    /// <summary>
    /// 装饰节点(组合节点)
    /// </summary>
    public  class NodeDecorate : NodeCombine
    {
        //想要的结果类型
        [JsonProperty("resultType")]
        public NodeResultType m_ResultType;
        public NodeDecorate() : base(NodeType.Decorator)
        {
        }

        public override NodeResultType Execute()
        {
            NodeBase _node = m_childNodes[0];
            NodeResultType _type= _node.Execute();
            if (_type != m_ResultType)
                return NodeResultType.Running;
            return _type;
        }

        public void SetResultType(NodeResultType _type)
        {
            m_ResultType = _type;
        }
    }
}
